package com.atguigu.gulimall.authserver;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

/**
 * SpringSession的核心原理
 * 1）@EnableRedisHttpSession导入了RedisHttpSessionConfiguration配置
 * 		1.给容器中添加了一个组件
 * 			RedisIndexedSessionRepository：redis操作session。session的增删改查的封装类
 * 		2.SessionRepositoryFilter  是一个Filter，实现了javax.servlet中的Filter。是session存储过滤器，每个请求过来必须经过filter
 *			a）创建的时候，只有有参构造，接收SessionRepository接口实例，就自动从容器中获取到SessionRepository(即上一步的RedisIndexedSessionRepository)
 *			b）SessionRepositoryFilter间接实现了javax.servlet中的Filter，因此它需要实现doFilter方法，而doFilter方法调用了SessionRepositoryFilter自己写的doFilterInternal方法
 *			c）SpringSession的核心(即如何从tomcat手中夺取到session的控制权存入redis)代码就在doFilterInternal方法内部
 *			d）doFilterInternal方法包装了request，这样就可以扩展request的getSession()方法 ---------极其重要(包装类/装饰者设计模式，用于对原有类的功能进行扩展)
 *			e）如何扩展？	查看包装类SessionRepositoryRequestWrapper扩展的getSession()方法，里面调用了getRequestedSession()，而这里面就从sessionRepository中获取sessionId。
 *			f）之前提到过，RedisIndexedSessionRepository就是session在redis中的增删改查的封装类(sessionRepository是个接口，他有很多实现，代表着session可以存储在不同的地方，这里是存到redis中)
 *			g）over
 *
 * 2）session在redis中也有自动续期功能(比如用户刷新就会自动续期)，而且在用户关掉浏览器后，便会进行过期删除，相当于用户的退出操作
 */

@EnableRedisHttpSession		//开启springsession的功能，整合redis作为session的存储
@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class GulimallAuthServerApplication {

	public static void main(String[] args) {
		SpringApplication.run(GulimallAuthServerApplication.class, args);
	}

}
